﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Data.Entity;
using VehicleMaintenance.Models;

namespace VehicleMaintenance
{
	static class Program
	{
		/// <summary>
		/// 应用程序的主入口点。
		/// </summary>
		[STAThread]
		static void Main()
		{
			//Database.SetInitializer<CarDB>(new MyDatabaseInitializer());

			//处理未捕获的异常   
			Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
			//处理UI线程异常   
			Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
			//处理非UI线程异常   
			AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new VehicleMaintenance.LoginForm());
		}

		/// <summary>
		///这就是我们要在发生未处理异常时处理的方法，我这是写出错详细信息到文本，如出错后弹出一个漂亮的出错提示窗体，给大家做个参考
		///做法很多，可以是把出错详细信息记录到文本、数据库，发送出错邮件到作者信箱或出错后重新初始化等等
		///这就是仁者见仁智者见智，大家自己做了。
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
		{

			string str = "";
			string strDateInfo = "出现应用程序未处理的异常：" + DateTime.Now.ToString() + "\r\n";
			Exception error = e.Exception as Exception;
			if (error != null)
			{
				str = string.Format(strDateInfo + "异常类型：{0}\r\n异常消息：{1}\r\n异常信息：{2}\r\n",
					 error.GetType().Name, error.Message, error.StackTrace);
			}
			else
			{
				str = string.Format("应用程序线程错误:{0}", e);
			}

			VehicleMaintenance.Comm.TextIO.WriteLog(str);
			if (MessageBox.Show("发生致命错误，请及时联系作者！", "系统错误", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop) == DialogResult.Abort)
			{
				Application.Exit();
			}
		}

		static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
		{
			string str = "";
			Exception error = e.ExceptionObject as Exception;
			string strDateInfo = "出现应用程序未处理的异常：" + DateTime.Now.ToString() + "\r\n";
			if (error != null)
			{
				str = string.Format(strDateInfo + "Application UnhandledException:{0};\n\r堆栈信息:{1}", error.Message, error.StackTrace);
			}
			else
			{
				str = string.Format("Application UnhandledError:{0}", e);
			}

			VehicleMaintenance.Comm.TextIO.WriteLog(str);
			if (MessageBox.Show("发生致命错误，请停止当前操作并及时联系作者！", "系统错误", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop) == DialogResult.Abort)
			{
				Application.Exit();
			}
		}

		public class MyDatabaseInitializer : DropCreateDatabaseIfModelChanges<CarDBContext>
		{
			protected override void Seed(CarDBContext context)
			{
				base.Seed(context);
				//Add a User and Role Sample!            Membership.CreateUser("parag", "test123");            Roles.CreateRole("Admin");            Roles.AddUsersToRole(new[] {"parag"}, "Admin");      
			}
		}
	}
}
